目錄
使用 Python 查詢上一個實驗所儲存在 DynamoDB 內的資料,本實驗將提供這樣的整合練習:Python SDK + DynamoDB
AWS Academy Learner Lab 是提供一個帳號讓學生可以自行使用 AWS 的服務,讓學生可以在 50 USD的金額下,自行練習所要使用的 AWS 服務,在此先介紹一下 Learner Lab 基本操作與限制。
在 AWS Academy 學習平台 的入口首頁 https://www.awsacademy.com/LMS_Login ,選擇以學生 (Students) 身分登錄,在課程選單中選擇 AWS Academy Learner Lab - Foundation Services 的課程,在課程選單中選擇 單元 (Module),接著單擊 啟動 AWS Academy Learner Lab,如下圖所示。
圖 1. 啟動 AWS Academy Learner Lab
進入 Learner Lab 中,說明一下每個區塊,圖形在下方。
圖 2. Learner Lab 畫面說明
AWS Cloud9 IDE 畫面與 VS Code 畫面相似,左手邊是功能視窗,可以檢視檔案與其他功能;,右上方是檔案編輯畫面,可以進行檔案編輯,撰寫程式進行 AWS SDK 操作;右下方則是終端命令列介面,可以輸入指令,進行 AWS CLI 操作。
圖 3. AWS Cloud9 IDE
在下方的終端輸入以下指令,取得實驗所需要的資源,可以在左上角看到已下載的檔案。
git clone https://github.com/yehchitsai/AIoTnAWSCloud
圖 4. 取得實驗所需要的資源
檢查 Cloud9 開發環境的套件版本
工具 | 版本 |
---|---|
git | 2.40.1 (git -v) |
AWS CLI | aws-cli/2.17.24 Python/3.11.9 Linux/6.1.102-108.177.amzn2023.x86_64 exe/x86_64.amzn.2023 (aws --version) |
python | 3.9.16 (python3 -V) |
boto3 | 1.34.161 (pip list) |
s3transfer | 0.10.2 |
openpyxl | 3.1.5 |
et-xmlfile | 1.1.0 |
pandas | 2.0.3 |
numpy | 1.24.4 |
tzdata | 2024.1 |
pytz | 2024.1 |
python-dateutil | 2.9.0.post0 |
打開 query_prinarykey.py 並執行,會得到一筆資料或是沒有,結果下圖。
圖 5. query_prinarykey.py 執行結果
# Returns a set of attributes for the item of DynamoDB table with the given primary key
import json
import boto3
import logging
from botocore.exceptions import ClientError
logger = logging.getLogger(__name__)
dyn_resource = boto3.resource("dynamodb")
table_name = 'students'
table = dyn_resource.Table(table_name)
result = table.get_item(
Key={'student_id': 's003'},
ConsistentRead=True,
)
if result.get('Item'):
print(result['Item'])
else:
print('not found')
打開 query_sql.py 並執行,會得到多筆資料(雖然只有一筆,但是以陣列方式呈現),結果下圖。
圖 6. query_sql.py 執行結果
# Query a DynamoDB table by using PartiQL statements and an AWS SDK
import json
import boto3
import logging
from botocore.exceptions import ClientError
logger = logging.getLogger(__name__)
dyn_resource = boto3.resource("dynamodb")
table_name = 'students'
table = dyn_resource.Table(table_name)
def run_partiql(statement, param_list):
try:
output = dyn_resource.meta.client.execute_statement(
Statement=statement,
Parameters=param_list
)
except ClientError as err:
logger.error(
"Couldn't execute batch of PartiQL statements. Here's why: %s: %s",
err.response["Error"]["Code"],
err.response["Error"]["Message"],
)
raise
else:
return output
sql = f'SELECT * FROM "{table_name}" WHERE city=? '
parameters = ['台中市']
results=run_partiql(sql,parameters)
print(results['Items'])
打開 query_scan.py 並執行,會得到多筆資料(雖然只有一筆,但是以陣列方式呈現),結果下圖。
圖 7. query_scan.py 執行結果
# Query a DynamoDB table by using PartiQL statements and an AWS SDK
import json
import boto3
import logging
from botocore.exceptions import ClientError
logger = logging.getLogger(__name__)
dyn_resource = boto3.resource("dynamodb")
table_name = 'students'
table = dyn_resource.Table(table_name)
results = table.scan(
FilterExpression="#city = :v1",
ExpressionAttributeNames={'#city': 'city'},
ExpressionAttributeValues={
':v1': '台中市'
}
)
if len(results['Items'])>0:
print(results['Items'])
else:
print('not found')